# -*- coding: utf-8 -*-
"""
@Time : 2024/9/29 21:43
@Author : ChenXiaoliang
@Email : middlegod@sina.com
@File : generate_video.py
"""

import textwrap
from pathlib import Path

from moviepy.editor import ImageSequenceClip, CompositeVideoClip, AudioFileClip, TextClip, ImageClip, vfx
from natsort import os_sorted

from generate_audio import generate_audio
from generate_cover_pic import generate_cover_pic
from generate_text_pics import generate_text_pics


def generate_video(title, content, watermark, bgm='no'):
    src_folder = Path('pics_for_video')

    # 生成mp3文件 speech.mp3
    generate_audio(content, bgm=bgm)

    duration_ls = generate_text_pics(content)
    print("时间列表长度：", len(duration_ls))
    img_ls = [str(i) for i in src_folder.glob('*.jpg')]
    img_ls = os_sorted(img_ls)

    video_clip = ImageSequenceClip(img_ls, durations=duration_ls)

    # 读取音频文件
    audio_clip = AudioFileClip('final_audio.mp3')
    # 将音频设置到视频上
    video_clip = video_clip.set_audio(audio_clip)

    # 添加文字水印
    w_mark = TextClip(txt=watermark, color='red', fontsize=80, font=r'./font/AlimamaFangYuanTiVF-Thin.ttf',
                      kerning=-10)
    # 设置文字水印的显示位置
    w_mark = w_mark.set_position(('center', 'center'))
    # 设置文字水印的不透明度
    w_mark = w_mark.set_opacity(0.3)
    # 设置文字水印的展示时长
    w_mark = w_mark.set_duration(video_clip.duration)

    # 添加文字标题
    # 先处理文字标题 超长换行等
    # 设置换行宽度，这通常取决于视频的宽度和你想要的字体大小
    wrap_width = 10

    # 使用 textwrap 模块进行换行处理
    wrapped_text = textwrap.fill(title, width=wrap_width)
    print(wrapped_text)
    title_obj = TextClip(txt=wrapped_text, color='yellow', stroke_color='red', stroke_width=2,
                         fontsize=120,
                         font=r'./font/AlimamaShuHeiTi-Bold.ttf',
                         kerning=0)
    # 设置文字标题的显示位置
    title_obj = title_obj.set_position(('center', 150))
    # 设置文字标题的不透明度
    title_obj = title_obj.set_opacity(1)
    # 设置文字标题的展示时长 即封面的展示时长 也即第一张图片的展示时长 也即音频开头的空白时间
    title_obj = title_obj.set_duration(2)

    # 添加图片水印
    # 创建水印对象
    pic = ImageClip('flag.png')
    # 一系列设置
    pic = pic.resize(0.3)
    pic = pic.set_position(('center', 'top'))
    pic = pic.set_opacity(0.6)
    pic = pic.set_duration(video_clip.duration)

    # 额外的图片
    # pic_ext = ImageClip('3.png')
    # pic_ext = pic_ext.resize(0.8)
    # pic_ext = pic_ext.set_position(('center', 600))
    # pic_ext = pic_ext.set_opacity(0.9)
    # pic_ext = pic_ext.set_duration(video_clip.duration)

    # 合并片头标题、文字水印、图片水印
    # video_clip = CompositeVideoClip([video_clip, pic, w_mark, title_obj, pic_ext])
    video_clip = CompositeVideoClip([video_clip, pic, w_mark, title_obj])

    # 视频开头增加淡入效果
    video_clip = video_clip.fx(vfx.fadein, 1)
    # 视频尾部增加淡出效果
    # video_clip = video_clip.fx(vfx.fadeout, 1)

    # 颜色增强 可以整体调亮或者调暗
    # video_clip = video_clip.fx(vfx.colorx, 1.2)

    # 实际导出视频文件
    video_clip.write_videofile('short_video_demo.mp4', fps=120)

    # 调用获取封面图片方法
    generate_cover_pic()


if __name__ == '__main__':
    generate_video(
        "国庆节快乐！    普天同庆  祝福祖国",
        """大雨落幽燕，
白浪滔天，
秦皇岛外打鱼船。
一片汪洋都不见，
知向谁边？
往事越千年，
魏武挥鞭，
东临碣石有遗篇。
萧瑟秋风今又是，
换了人间。""",
        "仰望天空的蜗牛",
        bgm='yes'
    )
